/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-10-29 19:04:52 +0000 (Mon, 29 Oct 2012) $
  Revision     : $Revision: 108 $
*******************************************/

package gui.usuario;

import java.util.List;
import java.util.Vector;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;

import listeners.ManejadorEventoCambioTexto;
import mensaje.Mensaje;
import utilidad.IPropiedades;
import api.IGrupoUsuariosAPI;
import control.App;
import frente.GrupoUsuarios;
import frente.Usuario;
import generico.GenericoComboBoxModel;

/**
 * Informacion general de usuario.
 * 
 * @author jose.lara 15.06.2012
 */
public class EditarUsuarioPanelGeneral extends JPanel {
    private static final long serialVersionUID = -4988215267048507258L;
    
    private JTextField nombreTextField                      = null;
    private JTextField correoTextField                      = null;
    private JTextField usuarioTextField                     = null;
    private JPasswordField clavePasswordField               = null;
    private JPasswordField confirmacionClavePasswordField   = null;
    private JComboBox<GrupoUsuarios> grupoUsuariosCombo     = null;
    private ManejadorEventoCambioTexto escuchador           = null;
    
    public EditarUsuarioPanelGeneral() {
        super();
        JLabel nombreLabel = new JLabel(Mensaje.getMensaje("TABLA_USUARIOS-NOMBRE"));
        JLabel correoLabel = new JLabel(Mensaje.getMensaje("TABLA_USUARIOS-CORREO"));
        JLabel usuarioLabel = new JLabel(Mensaje.getMensaje("TABLA_USUARIOS-NOMBRE_USUARIO"));
        JLabel claveLabel = new JLabel(Mensaje.getMensaje("DIALOGO_USUARIO-CLAVE"));
        JLabel confirmacionClaveLabel = new JLabel(Mensaje.getMensaje("DIALOGO_USUARIO-CONFIRMACION_CLAVE"));
        JLabel grupoUsuariosLabel = new JLabel(Mensaje.getMensaje("DIALOGO_USUARIO-GRUPO"));
        
        usuarioTextField = new JTextField();
        usuarioTextField.getDocument().addDocumentListener(getEscuchador());
        
        clavePasswordField = new JPasswordField();
        clavePasswordField.getDocument().addDocumentListener(getEscuchador());
        
        confirmacionClavePasswordField = new JPasswordField();
        confirmacionClavePasswordField.getDocument().addDocumentListener(getEscuchador());
        
        nombreTextField = new JTextField();
        nombreTextField.getDocument().addDocumentListener(getEscuchador());
        
        correoTextField = new JTextField();
        correoTextField.getDocument().addDocumentListener(getEscuchador());
        
        inicializarGruposUsuarios();
        
        GroupLayout groupLayout = new GroupLayout(this);
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
                        .addComponent(usuarioLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(claveLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(correoLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(nombreLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(confirmacionClaveLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(grupoUsuariosLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
                        .addComponent(grupoUsuariosCombo, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(usuarioTextField, GroupLayout.DEFAULT_SIZE, 107, Short.MAX_VALUE)
                        .addComponent(clavePasswordField, Alignment.TRAILING)
                        .addComponent(confirmacionClavePasswordField, Alignment.TRAILING)
                        .addComponent(nombreTextField, GroupLayout.DEFAULT_SIZE, 256, Short.MAX_VALUE)
                        .addComponent(correoTextField))
                    .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(nombreLabel)
                        .addComponent(nombreTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(correoLabel)
                        .addComponent(correoTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(usuarioLabel)
                        .addComponent(usuarioTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(clavePasswordField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(claveLabel))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(confirmacionClaveLabel)
                        .addComponent(confirmacionClavePasswordField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                        .addComponent(grupoUsuariosCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(grupoUsuariosLabel))
                    .addGap(52))
        );
        setLayout(groupLayout);
    }
    
    protected JTextField getNombreTextField() {
        return nombreTextField;
    }
    
    protected JTextField getCorreoTextField() {
        return correoTextField;
    }
    
    protected JTextField getUsuarioTextField() {
        return usuarioTextField;
    }
    
    protected JPasswordField getClavePasswordField() {
        return clavePasswordField;
    }
    
    protected JPasswordField getConfirmacionClavePasswordField() {
        return confirmacionClavePasswordField;
    }
    
    protected JComboBox<GrupoUsuarios> getGrupoUsuariosCombo() {
        return grupoUsuariosCombo;
    }
    
    private void setGrupoUsuariosCombo(JComboBox<GrupoUsuarios> grupoUsuariosCombo) {
        this.grupoUsuariosCombo = grupoUsuariosCombo;
    }
    
    private void inicializarGruposUsuarios() {
        if(getGrupoUsuariosCombo() == null) {
            setGrupoUsuariosCombo(new JComboBox<GrupoUsuarios>(getGrupoUsuariosComboModel()));
        }
    }
    
    private static GenericoComboBoxModel<GrupoUsuarios> getGrupoUsuariosComboModel() {
        GenericoComboBoxModel<GrupoUsuarios> model  = null;
        Vector<GrupoUsuarios> datos                 = null;
        IGrupoUsuariosAPI gruposAPI                 = null;
        List<GrupoUsuarios> grupoUsuarios           = null;
        
        gruposAPI = App.getSesion().getGrupoUsuariosAPI();
        grupoUsuarios = gruposAPI.getTodosGrupoUsuarios();
        
        if(grupoUsuarios != null && !grupoUsuarios.isEmpty()) {
            datos = new Vector<GrupoUsuarios>();
            
            datos.addAll(grupoUsuarios);
            model = new GenericoComboBoxModel<GrupoUsuarios>(datos);
        }
        
        return model;
    }
    
    @Override
    public String getName() {
        return Mensaje.getMensaje("DIALOGO_USUARIO-GENERAL");
    }
    
    protected void setValoresUsuario(Usuario usuario) {
        String nombre               = null;
        String correo               = null;
        String nombreUsuario        = null;
        String clave                = null;
        
        if(usuario != null) {
            nombre = usuario.getNombre();
            correo = usuario.getCorreo();
            nombreUsuario = usuario.getNombreUsuario();
            clave = usuario.getClave();
        }
        
        getNombreTextField().setText(nombre);
        getCorreoTextField().setText(correo);
        getUsuarioTextField().setText(nombreUsuario);
        getClavePasswordField().setText(clave);
        getConfirmacionClavePasswordField().setText(clave);
        
        seleccionarGrupoUsuario(usuario);
    }
    
    private void seleccionarGrupoUsuario(Usuario usuario) {
        List<GrupoUsuarios> grupos  = null;
        
        grupos = ((GenericoComboBoxModel<GrupoUsuarios>)getGrupoUsuariosCombo().getModel()).getDatos();
        
        if (grupos != null) {
            for (GrupoUsuarios grupo : grupos) {
                if (grupo.getId().longValue() == usuario.getIdGrupoUsuarios().longValue()) {
                    getGrupoUsuariosCombo().setSelectedItem(grupo);
                }
            }
        }
    }
    
    private ManejadorEventoCambioTexto getEscuchador() {
        if(escuchador == null) {
            escuchador = new ManejadorEventoCambioTexto() {
                private static final long serialVersionUID = 3401130652473460303L;
                
                @Override
                public void textoCambia() {
                    notificarCambio();
                }
            };
        }
        
        return escuchador;
    }
    
    private void notificarCambio() {
        firePropertyChange(IPropiedades.CAMBIO_DATOS, false, true);
    }
}